import { AppConfig, ConvertOptions } from '../types';
import { readFileSync, writeFileSync, existsSync } from 'fs';
import * as path from 'path';

export class ConfigManager {
  private static configPath: string;
  private static defaultConfig: AppConfig = {
    theme: 'light',
    recentFiles: [],
    defaultOptions: {
      encoding: 'UTF-8',
      delimiter: ',',
      sheetName: 'Sheet1',
      hasHeader: true
    }
  };

  private static currentConfig: AppConfig;

  // 初始化配置管理器
  static initialize(appDataPath: string): void {
    this.configPath = path.join(appDataPath, 'config.json');
    this.loadConfig();
  }

  // 加载配置文件
  private static loadConfig(): void {
    try {
      if (existsSync(this.configPath)) {
        const configData = readFileSync(this.configPath, 'utf-8');
        this.currentConfig = { ...this.defaultConfig, ...JSON.parse(configData) };
      } else {
        this.currentConfig = { ...this.defaultConfig };
        this.saveConfig();
      }
    } catch (error) {
      console.error('配置文件加载失败:', error);
      this.currentConfig = { ...this.defaultConfig };
    }
  }

  // 保存配置文件
  private static saveConfig(): void {
    try {
      writeFileSync(this.configPath, JSON.stringify(this.currentConfig, null, 2), 'utf-8');
    } catch (error) {
      console.error('配置文件保存失败:', error);
    }
  }

  // 获取当前配置
  static getConfig(): AppConfig {
    return { ...this.currentConfig };
  }

  // 更新配置
  static updateConfig(updates: Partial<AppConfig>): void {
    this.currentConfig = { ...this.currentConfig, ...updates };
    this.saveConfig();
  }

  // 获取主题设置
  static getTheme(): string {
    return this.currentConfig.theme;
  }

  // 设置主题
  static setTheme(theme: string): void {
    this.currentConfig.theme = theme;
    this.saveConfig();
  }

  // 获取默认转换选项
  static getDefaultOptions(): ConvertOptions {
    return { ...this.currentConfig.defaultOptions };
  }

  // 更新默认转换选项
  static updateDefaultOptions(options: Partial<ConvertOptions>): void {
    this.currentConfig.defaultOptions = { ...this.currentConfig.defaultOptions, ...options };
    this.saveConfig();
  }

  // 添加最近文件
  static addRecentFile(filePath: string): void {
    // 移除重复项
    this.currentConfig.recentFiles = this.currentConfig.recentFiles.filter(
      path => path !== filePath
    );
    
    // 添加到开头
    this.currentConfig.recentFiles.unshift(filePath);
    
    // 限制最近文件数量
    if (this.currentConfig.recentFiles.length > 10) {
      this.currentConfig.recentFiles = this.currentConfig.recentFiles.slice(0, 10);
    }
    
    this.saveConfig();
  }

  // 获取最近文件列表
  static getRecentFiles(): string[] {
    return [...this.currentConfig.recentFiles];
  }

  // 清除最近文件列表
  static clearRecentFiles(): void {
    this.currentConfig.recentFiles = [];
    this.saveConfig();
  }

  // 重置为默认配置
  static resetToDefaults(): void {
    this.currentConfig = { ...this.defaultConfig };
    this.saveConfig();
  }

  // 导出配置
  static exportConfig(): string {
    return JSON.stringify(this.currentConfig, null, 2);
  }

  // 导入配置
  static importConfig(configData: string): boolean {
    try {
      const importedConfig = JSON.parse(configData);
      this.currentConfig = { ...this.defaultConfig, ...importedConfig };
      this.saveConfig();
      return true;
    } catch (error) {
      console.error('配置导入失败:', error);
      return false;
    }
  }

  // 检查配置有效性
  static validateConfig(config: any): boolean {
    try {
      // 基本验证
      if (!config || typeof config !== 'object') return false;
      
      // 主题验证
      if (config.theme && typeof config.theme !== 'string') return false;
      
      // 最近文件验证
      if (config.recentFiles && !Array.isArray(config.recentFiles)) return false;
      
      // 默认选项验证
      if (config.defaultOptions) {
        const opts = config.defaultOptions;
        if (opts.encoding && typeof opts.encoding !== 'string') return false;
        if (opts.delimiter && typeof opts.delimiter !== 'string') return false;
        if (opts.sheetName && typeof opts.sheetName !== 'string') return false;
        if (opts.hasHeader && typeof opts.hasHeader !== 'boolean') return false;
      }
      
      return true;
    } catch {
      return false;
    }
  }
}